package edu.biwu.Interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyHandleInterceptor02 implements HandlerInterceptor{
    /**
     * preHandle特点:
     *    在控制器方法执行之前调用
     *    按拦截器定义的顺序正向执行
     *    是拦截器链中最先执行的方法
     *    可通过返回值决定请求是否继续向下执行(返回 `true` 时请求继续传递(拦截器链继续执行),返回 false.立即中断拦截器链的执行)
     *  可以用于权限控制
     * @param request
     * @param response
     * @param handler
     * @return  如果返回false,那么将不会执行Handler,返回true,才会放行执行Handler
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("...preHandle02...");
//        return true;
        return false;
    }

    /**
     * postHandle特点:
     *   在控制器方法执行完成后，视图渲染之前调用
     *   按拦截器定义的顺序逆向执行
     *   仅当所有 `preHandle` 返回 `true` 且控制器方法执行成功时才调用
     *   如果控制器方法抛出异常，则不执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("...postHandle02...");
    }

    /** afterCompletion特点:
     *   在整个请求完成后（视图渲染结束后）调用
     *   按拦截器定义的顺序逆向执行
     *   仅对 `preHandle` 返回 `true` 后的拦截器调用
     *   无论控制器方法是否抛出异常都会执行
     *  可以用于资源清理
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("...afterCompletion02...");
    }


}
